<HTML>
<HEAD>
<!-- This HTML file has been created by texi2html 1.29
     from prop.tnf on 19 December 2010 -->

<TITLE>Association of properties to definitions - Associate Sets of Kinds to Objects</TITLE>
</HEAD>
<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#0000EE" VLINK="#551A8B" ALINK="#FF0000" BACKGROUND="gifs/bg.gif">
<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0" VALIGN=BOTTOM>
<TR VALIGN=BOTTOM>
<TD WIDTH="160" VALIGN=BOTTOM>
<A HREF="http://eli-project.sourceforge.net/">
<IMG SRC="gifs/elilogo.gif" BORDER=0>
</A>&nbsp;
</TD>
<TD WIDTH="25" VALIGN=BOTTOM>
<img src="gifs/empty.gif" WIDTH=25 HEIGHT=25>
</TD>
<TD ALIGN=LEFT WIDTH="475" VALIGN=BOTTOM>
<A HREF="index.html"><IMG SRC="gifs/title.png" BORDER=0></A>
</TD>
<!-- |DELETE FOR SOURCEFORGE LOGO|
<TD>
<a href="http://sourceforge.net/projects/eli-project">
<img
  src="http://sflogo.sourceforge.net/sflogo.php?group_id=70447&amp;type=13"
  width="120" height="30"
  alt="Get Eli: Translator Construction Made Easy at SourceForge.net.
    Fast, secure and Free Open Source software downloads"/>
</a>
</TD>
|DELETE FOR SOURCEFORGE LOGO| -->
</TR>
</TABLE>

<HR size=1 noshade width=785 align=left>
<TABLE BORDER=0 CELLSPACING=2 CELLPADDING=0>
<TR>
<TD VALIGN=TOP WIDTH="160">
<h4>General Information</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="index.html">Eli: Translator Construction Made Easy</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="gindex_1.html#SEC1">Global Index</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="faq_toc.html" >Frequently Asked Questions</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="ee.html" >Typical Eli Usage Errors</a> </td></tr>
</table>

<h4>Tutorials</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="EliRefCard_toc.html">Quick Reference Card</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="novice_toc.html">Guide For new Eli Users</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="news_toc.html">Release Notes of Eli</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="nametutorial_toc.html">Tutorial on Name Analysis</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="typetutorial_toc.html">Tutorial on Type Analysis</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="ee.html" >Typical Eli Usage Errors</a> </td></tr>
</table>

<h4>Reference Manuals</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="ui_toc.html">User Interface</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="pp_toc.html">Eli products and parameters</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="lidoref_toc.html">LIDO Reference Manual</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="ee.html" >Typical Eli Usage Errors</a> </td></tr>
</table>

<h4>Libraries</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="lib_toc.html">Eli library routines</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="modlib_toc.html">Specification Module Library</a></td></tr>
</table>

<h4>Translation Tasks</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="lex_toc.html">Lexical analysis specification</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="syntax_toc.html">Syntactic Analysis Manual</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="comptrees_toc.html">Computation in Trees</a></td></tr>
</table>

<h4>Tools</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="lcl_toc.html">LIGA Control Language</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="show_toc.html">Debugging Information for LIDO</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="gorto_toc.html">Graphical ORder TOol</a> </td></tr>
</table>
<p>
<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="fw_toc.html">FunnelWeb User's Manual</a> </td></tr>
</table>
<p>
<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="ptg_toc.html">Pattern-based Text Generator</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="deftbl_toc.html">Property Definition Language</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="oil_toc.html">Operator Identification Language</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="tp_toc.html">Tree Grammar Specification Language</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="clp_toc.html">Command Line Processing</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="cola_toc.html">COLA Options Reference Manual</a> </td></tr>
</table>
<p>
<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="idem_toc.html">Generating Unparsing Code</a> </td></tr>
</table>
<p>
<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="mon_toc.html">Monitoring a Processor's Execution</a> </td></tr>
</table>

<h4>Administration</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="sysadmin_toc.html">System Administration Guide</a> </td></tr>
</table>

<HR WIDTH="100%">
<A HREF="mailto:eli-project-users@lists.sourceforge.net">
<IMG SRC="gifs/button_mail.gif" BORDER=0 ALIGN="left"></A>
<A HREF="index.html"><IMG SRC="gifs/home.gif" BORDER=0 ALIGN="right"></A>

</TD>
<TD VALIGN=TOP WIDTH="25"><img src="gifs/empty.gif" WIDTH=25 HEIGHT=25></TD>

<TD VALIGN=TOP WIDTH="600">
<H1>Association of properties to definitions</H1>
<P>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="prop_7.html"><IMG SRC="gifs/prev.gif" ALT="Previous Chapter" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="prop_9.html"><IMG SRC="gifs/next.gif" ALT="Next Chapter" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="prop_toc.html"><IMG SRC="gifs/up.gif" ALT="Table of Contents" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT="">
<HR size=1 noshade width=600 align=left>
<H1><A NAME="SEC8" HREF="prop_toc.html#SEC8">Associate Sets of Kinds to Objects</A></H1>
<P>
Objects in an input text are often classified to belong to one or more
of several kinds, e.g. variables, procedures or labels in programming
languages. They may occur in different contexts which determine their kind,
require that they belong to a certain kind, or select different computations
depending on their kind.
Such a classification is often the part of the type analysis task.
<P>
This module can be used for any classification of objects
which is encoded by non negative integral values.
<P>
The module is instantiated by
<PRE>
   $/Prop/KindSet.gnrc+instance=NAME +referto=KEY :inst
</PRE>
<A NAME="IDX54"></A>
<A NAME="IDX55"></A>
<P>
The module uses sets of kinds implemented by values of type
<CODE>unsigned int</CODE> provided by the <CODE>IntSet</CODE> module (see  <A HREF="adt_4.html#SEC4">Bit Sets of Integer Size of Bit Sets of Integer Size</A>).
(That module is instantiated automatically with <CODE>referto</CODE> parameter
<CODE>int</CODE>, and the <CODE>instance</CODE> parameter omitted.)
Hence the largest code chosen for a kind value must be less than
the number of bits
of an <CODE>unsigned int</CODE> (16 or 32 implementation dependent).
<A NAME="IDX56"></A>
<P>
This module associates a property named <CODE>NAMEKindSet</CODE> of type 
<CODE>IntSet</CODE> to objects. 
Three computational roles <CODE>NAMEAddKind</CODE>, <CODE>NAMEAddKindSet</CODE>,
and <CODE>NAMEGetKindSet</CODE> are provided. 
<A NAME="IDX57"></A>
<A NAME="IDX58"></A>
<P>
In a context <CODE>NAMEAddKind</CODE>
the kind value of the attribute <CODE>NAMEAddKind.NAMEKind</CODE> is added to
the set of kinds of the object. The attribute
has to be provided by a user's computation.
<A NAME="IDX59"></A>
<A NAME="IDX60"></A>
<P>
Similarly in a context <CODE>NAMEAddKindSet</CODE> the <CODE>IntSet</CODE> value of 
the attribute <CODE>NAMEAddKindSet.NAMEKindSet</CODE> is united to
the set of kinds of the object. The attribute
has to be provided by a user's computation.
<A NAME="IDX61"></A>
<A NAME="IDX62"></A>
<P>
In a context <CODE>NAMEGetKindSet</CODE> the property is accessed and supplied by
the attribute <CODE>NAMEGetKindSet.HasNAMEKindSet</CODE>.
It can be used to compare the set of required kinds to the
set of associated kinds using functions of the <CODE>IntSet</CODE> module.
<P>
The roles <CODE>AddKind</CODE> and <CODE>AddKindSet</CODE> must not be associated
to the same grammar symbol. <CODE>GetKindSet</CODE> may be combined with
one of them. That is necessary if kinds are determined
by applications of objects rather than by definitions, or if a
language does not distinguish between defining and applied occurrences.
<A NAME="IDX63"></A>
<A NAME="IDX64"></A>
<P>
<CODE>NAMERangeKindSet</CODE> is automatically associated to the
grammar root (see  <A HREF="prop_1.html#SEC1">Common Aspects of Property Modules</A>).
If the <CODE>NAMEKindSet</CODE> property is accessed in other user's computations,
those have to state <CODE>NAMERangeKindSet.GotNAMEKind</CODE> as precondition.
<P>
This module also provides three operations that modify
<CODE>NAMEKindSet</CODE> properties stored in the definition module:
<P>
<CODE>InsertNAMEKindSet(k,i)</CODE> inserts element <CODE>i</CODE> into the
set stored for key <CODE>k</CODE>, and yields the new set as result.
<P>
<CODE>UnionNAMEKindSet(k,s)</CODE> adds the set <CODE>s</CODE> to the
set stored for key <CODE>k</CODE>, stores the result and returns it.
<P>
<CODE>IntersectNAMEKindSet(k,s)</CODE> intersects the set <CODE>s</CODE> with
set stored for key <CODE>k</CODE>, stores the result and returns it.
<P>
We demonstrate the use of this module in our running example.
It shall be analysed if each variable occurs at least once on the
lefthand side of an assignment and on the righthand side.
Hence, we introduce the kinds <CODE>VarAssigned</CODE> and <CODE>VarUsed</CODE>.
A variable can have any set of the values depending on its occurrences.
The values are named by a <CODE>.head</CODE> specification:
<P>
<PRE>
   #define   VarAssigned    1
   #define   VarUsed        2
</PRE>
<P>
In our tree grammar the two occurrences of variables can be distinguished
for the symbol <CODE>Variable</CODE> rather than for the symbol <CODE>UseIdent</CODE>.
Hence we propagate the <CODE>Key</CODE> attribute of <CODE>UseIdent</CODE>
upto <CODE>Variable</CODE> and apply the module roles there:
<P>
<PRE>
   SYMBOL Variable: Key: DefTableKey;
   RULE: Variable ::= UseIdent COMPUTE
     Variable.Key = UseIdent.Key;
   END;

   RULE: Statement::= Variable '=' Expression ';' COMPUTE
     Variable.Kind = VarAssigned;
   END;

   RULE: Expression ::= Variable COMPUTE
     Variable.Kind = VarUsed
   END;

   SYMBOL Variable INHERITS AddKind END;
</PRE>
<P>
In the context of a variable declaration the set of kinds is checked
using functions of the <CODE>IntSet</CODE> module:
<P>
<PRE>
   SYMBOL DefIdent INHERITS GetKindSet END;
   RULE: ObjDecl ::= TypeDenoter DefIdent COMPUTE
     IF (NOT (InIS (VarAssigned, DefIdent.HasKindSet)),
     printf ("variable %s declared in line %d is never assigned\n", 
              StringTable (DefIdent.Sym), LINE));

     IF (NOT (InIS (VarUsed, DefIdent.HasKindSet)),
     printf ("variable %s declared in line %d is never assigned\n",
              StringTable (DefIdent.Sym), LINE));
   END;
</PRE>
<P>
<A NAME="IDX66"></A>
<A NAME="IDX67"></A>
<A NAME="IDX68"></A>
<A NAME="IDX69"></A>
<A NAME="IDX70"></A>
<A NAME="IDX65"></A>
<HR size=1 noshade width=600 align=left>
<P>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="prop_7.html"><IMG SRC="gifs/prev.gif" ALT="Previous Chapter" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="prop_9.html"><IMG SRC="gifs/next.gif" ALT="Next Chapter" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="prop_toc.html"><IMG SRC="gifs/up.gif" ALT="Table of Contents" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT="">
<HR size=1 noshade width=600 align=left>
</TD>
</TR>
</TABLE>

</BODY></HTML>
